home *** CD-ROM | disk | FTP | other *** search
- #include <StringTools.h>
- #include <stdarg.h> // for va_xxx
- #include <string.h> // for memcmp
-
- /*------------------------------------------------------------------------------*/
-
- void CopyString (Str255 String1, Str255 String2)
- /* copy the entire contents of String1 into String2 */
- {
- BlockMove (String1, String2, String1[0]+1);
- }
-
- /*------------------------------------------------------------------------------*/
-
- StringPtr String2String (StringPtr InString)
- /* make a copy of the passed string */
- {
- StringPtr NewString = NULL;
-
- if (InString)
- {
- NewString = (StringPtr)NewPtr(*InString + 1);
- if (NewString)
- BlockMove (InString, NewString, *InString+1);
- }
- return NewString;
- }
-
- /*------------------------------------------------------------------------------*/
-
- void PStrCpy (StringPtr Source, StringPtr Dest, short numToCopy)
- /* Given two pascal strings, this routine replaces the contents of */
- /* the second string with numToCopy characters of the first string */
- {
- BlockMove (Source, Dest, numToCopy);
- Dest[0] = numToCopy;
- }
-
- /*------------------------------------------------------------------------------*/
-
- short PStrLen (StringPtr TheString)
- {
- if (TheString)
- return *TheString;
- else
- return 0;
- }
-
- /*------------------------------------------------------------------------------*/
-
- short PStrCmp (StringPtr String1, StringPtr String2)
- /* if String1 is > String2, return a positive number; if String1 is equal to */
- /* String2, return 0; if String1 is < String2, return a negative number */
- {
- short Result;
-
- // first handle either or both of the inputs being NULL
- if ((!String1) && (String2)) return -1;
- if ((!String2) && (String1)) return 1;
- if (!String2 && !String1) return 0;
-
- // we know both strings are valid; use memcmp to compare them
- Result = memcmp (String1+1, String2+1, (*String1 > *String2) ? *String2 : *String1);
- if ((Result == 0) && (*String1 != *String2)) // if strings are Δ lengths,
- return ((*String1 > *String2) ? 1 : -1); // modify result based on length
- else // otherwise
- return Result; // return the result unchanged
- }
-
-
- /*------------------------------------------------------------------------------*/
-
- Boolean PStringCmp (register StringPtr String1, register StringPtr String2)
- {
- short i, max = String1[0];
-
- if (String1[0] != String2[0])
- return FALSE;
-
- for (i = 1;i <= max;i++)
- if (String1[i] != String2[i])
- return FALSE;
-
- return TRUE;
- }
-
- /*------------------------------------------------------------------------------*/
-
- StringPtr PStrCat (short maxLen, Str255 Dest, short numArgs,...)
- /* concatenate a variable number of StringPtr's and store the result in */
- /* Dest; Dest will receive no more than maxLen characters, no matter how many */
- /* StringPtr's are passed in */
- {
- short i = 1, j = 1;
- va_list ap;
- StringPtr STemp = NULL;
- short argsLeft = numArgs;
-
- va_start (ap, numArgs);
- while (numArgs -- > 0)
- {
- STemp = (StringPtr)(va_arg (ap, Ptr)); // get the nth argument
-
- // copy characters from the source string to the Dest string
- for (j = 1; j <= *STemp; j++, i++)
- if (i <= maxLen)
- Dest[i] = STemp[j];
- }
- va_end (ap);
- Dest[0] = i-1;
- }
-
-